package file;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 74646
 * Date: 2022-06-24
 * Time: 17:49
 */
public class Demo18 {
    public static void main(String[] args) {
        // 1. 输入要扫描的文件路径
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要扫描的路径");
        String rootDirPath = sc.next();
        // 判断要扫描的路径
        File rootDir = new File(rootDirPath);
        if(!rootDir.isDirectory()){
            System.out.println("输入的路径不正确!");
            return;
        }
        System.out.println("请输入要查询的关键词：");
        String word = sc.next();
        // 2. 递归进行遍历
        scanDir(rootDir,word);
    }

    private static void scanDir(File rootDir, String word) {
        // 1. 列出 rootDir 中的内容
        File[] files = rootDir.listFiles();
        if(files == null){
            return;
        }
        // 2. 遍历每个元素，对普通文件和目录进行处理
        for (File f : files){
            if(f.isFile()){
                // 如果是普通文件，就进行内容查找
                if(containsWord(f,word)){
                    // 找到了就打印文件所在路径
                    try {
                        System.out.println(f.getCanonicalPath());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }else if(f.isDirectory()){
                // 如果是目录就进行递归遍历
                scanDir(f,word);
            }
        }
    }

    private static boolean containsWord(File f, String word) {
        StringBuilder stringBuilder = new StringBuilder();
        // 把 f 中的内容读取出来，放到 StringBuilder 中
        try(Reader reader = new FileReader(f)) {
            char[] chars = new char[1024];
            while (true){
                int len = reader.read(chars);
                if(len == -1){
                    // 读取完毕
                    break;
                }
                // 将的读到的结果放到 StringBuilder 中
                stringBuilder.append(chars,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        // indexOf 返回的是子串的下标，如果 word 在 stringBuilder 中不存在，则返回 -1
        return stringBuilder.indexOf(word) != -1;
    }
}
